﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//结构中的最后⼀个元素允许是未知⼤⼩的数组，这就叫做『柔性数组』成员。
//1.结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。
//2.sizeof 返回的这种结构⼤⼩不包括柔性数组的内存。
//3.包含柔性数组成员的结构⽤malloc ()函数进⾏内存的动态分配，并且分配的内存应该⼤于结构的⼤⼩，以适应柔性数组的预期⼤⼩。
struct st
{
	char c;
	int n;
	int arr[0];//柔性数组成员
};
struct st2
{
	char c;
	int n;
	int* arr;
};
int main()
{
	printf("%d\n", sizeof(struct st));//8

	//方法一有两个好处：1.方便内存释放（只有一次malloc和free） 2.有利于访问速度(连续malloc开辟内存空间中间是有空隙的，造成空间浪费，利用率不高)

	//方法一
	//struct st* ps = (struct st*)malloc(sizeof(struct st) + 10 * sizeof(int));
	//if (ps == NULL) {
	//	perror("malloc");
	//	return 1;
	//}
	//ps->c = 'w';
	//ps->n = 100;
	//for (int i = 0; i < 10; i++) {
	//	ps->arr[i] = i;
	//}
	//for (int i = 0; i < 10; i++) {
	//	printf("%d ", ps->arr[i]);
	//}
	////数组空间不够
	//struct st* ptr=(struct st*)realloc(ps, sizeof(struct st) + 15 * sizeof(int));
	//if (NULL!=ptr) {
	//	ps = ptr;
	//}
	//else {
	//	perror("realloc");
	//	return 1;
	//}
	//for (int i = 0; i < 15; i++) {
	//	ps->arr[i] = i;
	//}
	//for (int i = 0; i < 15; i++) {
	//	printf("%d ", ps->arr[i]);
	//}
	//printf("\n%c\n", ps->c);
	//printf("%d\n", ps->n);
	//free(ps);
	//ps = NULL;
	
	//方法二
	struct st2* ps = (struct st2*)malloc(sizeof(struct st) + 10 * sizeof(int));
	if (ps == NULL) {
		perror("malloc");
		return 1;
	}
	ps->c = 'w';
	ps->n = 100;
	ps->arr = (int*)malloc(10 * sizeof(int));
	if (ps->arr == NULL) {
		perror("malloc2");
		return 1;
	}
	for (int i = 0; i < 10; i++) {
		ps->arr[i] = i;
	}
	for (int i = 0; i < 10; i++) {
		printf("%d ", ps->arr[i]);
	}
	//数组空间不够
	int* ptr = (int *)realloc(ps->arr,15 * sizeof(int));
	if (NULL != ptr) {
     	  ps->arr= ptr;
	}
	else {
	      perror("realloc2");
	      return 1;
	}
	for (int i = 0; i < 15; i++) {
		ps->arr[i] = i;
	}
	for (int i = 0; i < 15; i++) {
		printf("%d ", ps->arr[i]);
	}
	printf("\n%c\n", ps->c);
	printf("%d\n", ps->n);
	free(ps->arr);
	ps->arr = NULL;
	free(ps);
	ps = NULL;
	return 0;
}